package com.itany.corejava.code17_设计模式.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * @author MissChen
 * @date 2024年03月28日 13:38
 */

// 创建一个实现InvocationHandler接口的处理器类，它将负责在代理对象上调用方法时候执行额外的操作
public class LogInvocationHandler implements InvocationHandler {
    private Object target;

    public LogInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * 代理方法的具体实现，该方法代理所有目标类中的所有方法
     * @param proxy 生成的代理对象
     * @param method 目标方法
     * @param args 目标方法的参数列表
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // System.out.println(Arrays.toString(args));

        // 参数1:从中调用底层方法的对象，即:目标对象
        // 参数2:目标方法的参数
        // 此时，无法确定目标类是谁，只有执行该方法的时候才能知道目标类是谁
        // 即:只有程序运行的时候才能知道目标类是谁
        // 因此,我们限制方法调用者必须传递目标类进来
        // 即：实例化当前对象时候使用构造方法创建对象，其参数即为目标对象
        System.out.println("动态代理在:"+new SimpleDateFormat("yyyy-MM-dd日 HH:mm:ss").format(new Date())+"即将执行"+method.getName()+"方法");
        Object result=method.invoke(target,args);
        System.out.println("动态代理在:"+new SimpleDateFormat("yyyy-MM-dd日 HH:mm:ss").format(new Date())+"成功执行"+method.getName()+"方法");
        return result;



    }
}
